<?php
/**
* 名称：帐号模型类。
* 描述：提供帐号会话过程的程式。
*/
final class Model_Account extends Model{
    /**
    * @const string 加密公钥。
    */
    const SAFEKEY='FE1F5FAJHKGIC3-6740JKGHJK-BBJKA0-DHJKGHJKEE1-2AEA9D05DFC02';

    /**
    * @const string cookie保存路径。
    */
    const COOKIE_PATH='/';

    /**
    * @const string cookie归属域名。
    */
    const COOKIE_DOMAIN=NULL;

    /**
    * @const string cookie过期时间，默认30天的时间。
    */
    const COOKIE_EXPIRE=2592000;

    /**
    * @const string 存储用户名的cookie名称。
    */
    const COOKIE_USERNAME='tryphp_y001_admin_x4_username_1EA4B87D-AFD6-89D8-FDBC-8AFA7E184402';

    /**
    * @const string 存储密码的cookie名称。
    */
    const COOKIE_PASSWORD='tryphp_y001_admin_x4_password_1EA4B87D-AFD6-89D8-FDBC-8AFA7E184402';

    /**
    * @const string 存储登录系统标识的cookie名称。
    */
    const COOKIE_SYSTEM='tryphp_y001_admin_x4_license_1EA4B87D-AFD6-89D8-FDBC-8AFA7E184402';

    /**
    * 描述：加密密码等信息。
    * @access public
    * @param  string $value 必选 要加密的字符串。
    * @return string
    */
    public static function Hash($value){
        return strtoupper(md5($value.self::SAFEKEY));
    }

    /**
    * 描述：检测是否己经登录。
    * @access public
    * @return boolean
    */
    public static function IsLogin(){
        return self::Is(Cookie::Get(self::COOKIE_USERNAME),Cookie::Get(self::COOKIE_PASSWORD));
    }

    /**
    * 描述：检测给出的用户和密码是不是正确。
    * @access public
    * @param  string  $username 必选 用户名。
    * @param  string  $password 必选 hash后的密码。
    * @return boolean
    */
    public static function IsRightUser($username,$password){
        return self::Is($username,$password);
    }

    /**
    * 描述：登出、注销、退出系统，删除cookie信息。
    * @access public
    * @return void
    */
    public static function Logout(){
        Cookie::Delete(self::COOKIE_USERNAME,self::COOKIE_PATH,self::COOKIE_DOMAIN);
        Cookie::Delete(self::COOKIE_PASSWORD,self::COOKIE_PATH,self::COOKIE_DOMAIN);
    }

    /**
    * 描述：根据获取到的信息，登录到系统。
    * @access public
    * @param  string  $username   必选 用户名。
    * @param  string  $password   必选 hash后的密码。
    * @param  string  $isRemember 必选 是否记住密码。
    * @return boolean
    */
    public static function Login($username,$password,$isRemember=NULL,$system=NULL){
        #记录登录信息
        $cookieExpire=NULL;
        if($isRemember){
            $cookieExpire=time()+self::COOKIE_EXPIRE;
        }
        $result=self::$Database->ExecParameterized(
            'UPDATE '.self::$Database->Table('admin').' SET `loginDatetime`=?,`loginCount`=`loginCount`+1 WHERE username=?',array(
            date('Y-m-d G:i:s'),
            $username
        ));
        #写入登录cookie
        Cookie::Set(self::COOKIE_USERNAME,$username,$cookieExpire,self::COOKIE_PATH,self::COOKIE_DOMAIN);
        Cookie::Set(self::COOKIE_PASSWORD,$password,$cookieExpire,self::COOKIE_PATH,self::COOKIE_DOMAIN);
        Cookie::Set(self::COOKIE_SYSTEM,$system,$cookieExpire,self::COOKIE_PATH,self::COOKIE_DOMAIN);
        return TRUE;
    }

    /**
    * 描述：验证表单、cookie或其它渠道的用户名和密码是否正确。
    * @access private
    * @param  string  $username 可选 用户名。
    * @param  string  $password 可选 hash后的密码。
    * @return boolean
    */
    private static function Is($username=NULL,$password=NULL){
        //检测是否为空，为空则则返回FALSE。
        if(empty($username)||empty($password)){
            return FALSE;
        }
        //验证信息是否与数据库信息一致。
        $data=self::$Database->GetRow(
            'SELECT * FROM '.self::$Database->Table('admin').' WHERE username=?',
            array($username)
        );
        //如果找不到用户或密码错误返回FALSE。
        if(empty($data)||$data['password']!=$password){
            return FALSE;
        }
        return TRUE;
    }
}